{{! recursive partial used to expand type definition
   HACK: Objects, Enums, Records and Arrays, which are used by reference
         and defined outside the main units have to be handled explicitly.
         All internal types have their Swagger-Typ defined. }}
{{<write-type}}{{#typeSwagger}}{{#Equals typeSwagger,typeSource}}{"$ref":"#/definitions/{{typeSwagger}}"}{{/Equals}}{{^Equals typeSwagger,typeSource}}{{typeSwagger}}{{/Equals}}{{/typeSwagger}}{{^typeSwagger}}{{#nestedSimpleArray}}{"type":"array","items":{{>write-type}}}{{/nestedSimpleArray}}{{/typeSwagger}}{{/write-type}}

{
    "swagger": "2.0",
    "info": {
        "description": "Generated by {{exeInfo}} using mORMot {{mORMotVersion}} at {{time}}",
        "title": "{{root}} API{{#exeVersion}} {{.}}{{/exeVersion}}",
        "version": "{{exeVersion}}"
    },
    "host": "{{host}}",
    "basePath": "/{{root}}",
    "tags": [
          {{#orm}}
		{
                "name": "{{tableName}}",
		"description": "ORM endpoint for {{root}}/{{tableName}} record"
		}{{^-last}},{{/-last}}
          {{/orm}}
	        {{#soa}}{{#hasorm}},{{/hasorm}}
          {{#services}}
		{
                "name": "{{uri}}",
                "description": {{#serviceDescription}}{{jsonQuote serviceDescription}}{{/serviceDescription}}{{^serviceDescription}}"SOA endpoint for {{root}}/{{uri}} service"{{/serviceDescription}}
		}{{^-last}},{{/-last}}
	  {{/services}}
          {{/soa}}
	],

    "definitions": {
      {{#orm}}
        "{{tableName}}": {
            "type": "object",
            "description": "ORM {{tableName}} record definition",
            "properties": {
              "ID":{"type":"integer","format":"int64"}{{#fields}},"{{name}}":{{typeSwagger}}{{/fields}}
            }
        },
       {{/orm}}
      {{#records}}
        "{{name}}": { 
            "type": "object",
            "description": "SOA {{name}} object DTO definition",
            "properties": {
              {{#fields}}
                "{{propName}}": {{>write-type}}{{^-last}},{{/-last}}
              {{/fields}}
            }
        },

      {{/records}}
      {{#arrays}}
        "{{name}}": {
            "type": "array",
            "summary": "SOA {{name}} array DTO definition",
            "items": {{>write-type}}
        },
      {{/arrays}}
      {{#enumerates}}
       "{{name}}": {
          "type": "string",
          "description": "SOA {{name}} enumeration DTO definition",
          "enum": [
               {{#values}}
               "{{.}}"{{^-last}},{{/-last}}
               {{/values}}
          ],           
          "required": true  
       },

      {{/enumerates}}
      "__error": {
          "type": "object",
          "description": "Generic error information",
          "properties": {
            "errorCode": {"type":"integer"},"errorText":{"type":"string"} }
      }
    },
    "paths": {
      {{#orm}}

      "/{{tableName}}":{
            "get": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "query ORM fields values on {{tableName}}",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [{
                        "name": "select",
                        "in": "query",
                        "description": "define returned fields of {{tableName}} query, set * to return all fields",
                        "required": true,
                        "type":"string"
                    },{
                        "name": "where",
                        "in": "query",
                        "description": "SELECT-like where condition for {{tableName}} query",
                        "required": false,
                        "type":"string"
                    },{
                        "name": "sort",
                        "in": "query",
                        "description": "order fields for {{tableName}} query",
                        "required": false,
                        "type":"string"
                    }],
                "responses": {
                    "200": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            }
        },
        "/{{tableName}}/":{
            "get": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "retrieve all {{tableName}} ORM ids",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [],
                "responses": {
                    "200": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            }
            , "post": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "creates a new {{tableName}} ORM record",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [{
                        "name": "body",
                        "in": "body",
                        "description": "new {{tableName}} JSON object content",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        },
                        "required": true
                    }],
                "responses": {
                    "201": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not writable or not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            }
        },
        "/{{tableName}}/{id}":{
            "get": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "retrieve a {{tableName}} ORM record by id",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [{
                        "name": "id",
                        "in": "path",
                        "description": "id to query {{tableName}}",
                        "required": true,
                        "type": "integer",
                        "format":"int64"
                    }],
                "responses": {
                    "200": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            }, "put": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "change a {{tableName}} ORM record by id",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [{
                        "name": "id",
                        "in": "path",
                        "description": "id to update {{tableName}}",
                        "required": true,
                        "type": "integer",
                        "format":"int64"
                    },{
                        "name": "body",
                        "in": "body",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        },
                        "description": "modified {{tableName}} JSON object content (partial fields accepted)",
                        "required": true
                    }],
                "responses": {
                    "200": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not writable or not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            },"delete": {
                "tags": [
                    "{{tableName}}"
                ],
                "summary": "remove a {{tableName}} ORM record by id",
                "description": "",
                "produces": [
                    "application/json"
                ],
                "parameters": [{
                        "name": "id",
                        "in": "path",
                        "description": "id to delete {{tableName}}",
                        "required": true,
                        "type": "integer",
                        "format":"int64"
                    }],
                "responses": {
                    "200": {
                        "description": "successful operation",
                        "schema": {
                            "$ref": "#/definitions/{{tableName}}"
                        }
                    },
                    "403": {
                        "description": "{{tableName}} not writable or not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "404": {
                        "description": "{{tableName}} not found"
                    },
                    "405": {
                        "description": "Unauthorized access to {{tableName}}"
                    }
                }
            }
        }{{^-last}},{{/-last}}

      {{/orm}}
      {{#soa}}{{#hasorm}},{{/hasorm}}{{#services}}
      {{#methods}}
        "/{{uri}}/{{methodName}}": {
            "post": {
		"description": {{jsonQuote methodDescription}},
		"tags": [
                   "{{uri}}"
                ],
                "parameters": [{
                    "in": "body",
                    "name": "body",
                    "schema": {
                        "type": "object",
                        "properties": { {{#args}}{{#dirInput}}
                            "{{argName}}": {{>write-type}}{{commaInSingle}}{{/dirInput}}{{/args}}
                        }
                    }
                }],
                "responses": {
                   "200": {
                      "description": "{{uri}}.{{methodName}} executed - check returned content for any application-level error{{^resultAsJSONObjectWithoutResult}}\r\n **Warning: Swagger doesn't support untyped arrays, so isn't able to correctly define the response - please use rather *ResultAsJSONObjectWithoutResult* for a public API**{{/resultAsJSONObjectWithoutResult}}",
                      "schema": {
                            "type": "object",
                            "properties": {
                            {{#resultAsJSONObjectWithoutResult}}
                            {{#args}} {{#dirOutput}}
                                "{{argName}}": {{>write-type}}{{#commaOutResult}},{{/commaOutResult}}
                            {{/dirOutput}}{{/args}}
                            {{/resultAsJSONObjectWithoutResult}}
                            {{^resultAsJSONObjectWithoutResult}}
                                "result": {
                                    "type": "array",
                                    "items": {"type":"string"}
                                }
                            {{/resultAsJSONObjectWithoutResult}}
                            }
                        }
                    },
                    "401": {
                        "description": "{{uri}}.{{methodName}} execution not allowed",
                         "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "403": {
                        "description": "{{uri}}.{{methodName}} not properly accessed",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    },
                    "406": {
                        "description": "{{uri}}.{{methodName}} execution failed - probably due to unexpected input",
                        "schema": {
                            "$ref": "#/definitions/__error"
                        }
                    }
                }
            }
        }{{^-last}},{{/-last}}
      {{/methods}}{{^-last}},{{/-last}}

      {{/services}}{{/soa}}
    }
}
